package org.csu.softwaremetrics_demo.metric.ck;

/**
 * NOPM（Number of Public Methods）度量类
 * 用于计算类中公共方法（public修饰的方法）的数量
 * 继承自AST访问器，实现了Metric接口
 */

import org.csu.softwaremetrics_demo.entity.common.CKMetricSingleClass;
import org.csu.softwaremetrics_demo.entity.result.Result;
import org.csu.softwaremetrics_demo.metric.Metric;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.Modifier;

public class NOPM extends ASTVisitor implements Metric<CKMetricSingleClass> {

    /**
     * 存储公共方法计数的字段
     */
    private int methods;

    /**
     * 访问方法声明节点
     * 只计算被public修饰符修饰的方法
     *
     * @param node 方法声明节点
     * @return false 表示不需要访问子节点
     */
    @Override
    public boolean visit(MethodDeclaration node) {
        if (Modifier.isPublic(node.getModifiers()))
            methods++;

        return false;
    }

    /**
     * 执行NOPM度量计算
     *
     * @param cu           编译单元
     * @param singleMetric 存储度量结果的对象
     * @param result       包含所有度量结果的报告
     */
    @Override
    public void execute(CompilationUnit cu, CKMetricSingleClass singleMetric, Result result) {
        cu.accept(this);
    }

    /**
     * 设置NOPM度量结果
     *
     * @param singleMetric 要设置结果的度量对象
     */
    @Override
    public void setSingleMetric(CKMetricSingleClass singleMetric) {
        singleMetric.setNopm(methods);
    }
}
